$Description$
共有$m$部电影,编号为$1\sim m$,第$i$部电影的好看值为$w_{i}$。在$n$天之中(从$1\sim n$编号)每天会放映一部电影,第$i$天放映的是第$~f_{i}~$部。你可以选择$l,r(1\leqslant l\leqslant r\leqslant n)$,并观看第$l,l+1,\cdots,r$天内所有的电影。如果同一部电影你观看多于一次,你会感到无聊,于是无法获得这部电影的好看值。所以你希望最大化观看且仅观看过一次的电影的好看值的总和。
$Solution$
枚举右端点$r$,维护一个序列$c,$其中$c_l$表示$l\sim r$的好看值。对于一个位置$i$的好看值$w_i$,把他上一次出现的位置记做$pre_{i}$。由于如果有一个好看值$w_i$出现两次及以上,那么$w_i$的贡献为$0$,只有出现一次时才有贡献,显然只有在$pre_i+1\sim i$才会出现一次,所以当前$r$枚举到$i,c_{pre_i+1}\sim c_{i}+=w_i,$另外, 对于一个$~i~,pre_{pre_{i}}+1\sim pre_{i}$在上一个$j(w_{j}==w_{i})$时加上了一个$w_i$,但是对于$i,pre_{pre_{i}}+1\sim pre_{i}$区间中$w_i$的贡献为$0$,所以还有减去
这些操作考虑用线段树维护
$Code$
1 |
|